package it.unicam.cs.cosy.bioshape.core.behaviours;

import java.io.Serializable;
import java.util.List;

/**
 * Represents active surfaces of the entity which are willingly to react (i.e.
 * bind and subsequently split). It maintains a list of feature <i>names</i>
 * with the associated <i>type</i> ({@code vertex}, {@code edge} or {@code face}
 * ). Binding probabilities can be added to simulate a more complex binding
 * behaviour.
 * 
 * @author Carmine Oliva Federico Buti
 */
// TODO: al fine di renderlo più generale possibile definiamo sta classe sulla
// base di STRINGHE e ID fissi per i tre tipi di feature. In questo modo
// otteniamo 2 risultati: indipendenza dalla struttura geometrica sotto e
// compattezza del codice (una struttura di sole stringhe e id è più piccola di
// una corrispondente struttura con oggetti feature e meno ridondante!
// TODO: bisogna prevedere una disabilitazione delle features. Se infatti in una
// collisione si ha contatto tra una feature vertice di un active site già bound
// si potrebbe avere una doppia inelastic collision con conseguente doppio bound
// il che sarebbe, a dir poco, deleterio!
public class ActiveSite implements Serializable {

	private static final long serialVersionUID = 2452586595807461553L;

	private List<String> featuresNames;

	private String name;

	/**
	 * Generates an {@code ActiveSite} object representing a subset of the
	 * surface of a shape on which a channel is active
	 * 
	 * @param name
	 *            Name of the active channel.
	 * @param featuresNames
	 *            Set of <i>polyhedral features</i> on which the channel is
	 *            active
	 */
	public ActiveSite(String name, List<String> featuresNames) {
		this.name = name;
		this.featuresNames = featuresNames;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		ActiveSite other = (ActiveSite) obj;
		if (featuresNames == null) {
			if (other.featuresNames != null)
				return false;
		} else if (!featuresNames.equals(other.featuresNames))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

	/**
	 * @return the name of the channel
	 */
	public String getName() {
		return name;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((featuresNames == null) ? 0 : featuresNames.hashCode());
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
}
